package carnetCommandes;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Observer;
import java.util.Vector;

import Usager.AbstractCompte;
import Usager.Client;

import restaurant.ListeRestaurant;
import restaurant.Adresse;
import restaurant.Produit;
import restaurant.Restaurant;

/**
 * 
 * @author julian
 * 
 *         Classe controlleur des commandes
 */
public class Registre {

	// Commande
	private Commande commande;

	// Restaurant
	private Restaurant resto;

	// Instance privee
	private static Registre instance;

	// Liste des restaurants
	private ListeRestaurant liste;
	
	// Liste des commandes
	private CarnetCommande carnet;

	// Client
	private AbstractCompte compteActif;
	
	// Temps
	private SimpleDateFormat timeFormat;
	private SimpleDateFormat dateFormat;

	// CONSTRUCTEUR
	private Registre() {

		dateFormat = new SimpleDateFormat("yyyy-MM-dd");
		timeFormat = new SimpleDateFormat("kk:mm:ss");

		liste = ListeRestaurant.getInstance();
		carnet = CarnetCommande.getInstance();

	}

	// Creation d'une nouvelle instance
	public static Registre getInstance() {

		if (instance == null)
			instance = new Registre();

		return instance;
	}

	// Commande actuelle
	public Commande commandeActuelle() {
		return commande;
	}

	// Demarrer une commande
	public void demarrerCommande() {
		
		Client client = (Client) getCompteActif();
		commande = new Commande(client.getProfil(), null);
	}

	// Confirmer commande
	// Retourne un numero de confirmation
	public int confirmerCommande() throws Exception {

		// Verification de l'etat de la commande
		if (commande.estVide())
			throw new Exception("Commande vide");

		// Enregistrement de la date et de l'heure
		commande.setDate(dateFormat.format(new Date()));
		commande.setHeure(timeFormat.format(new Date()));
		
		// Ajout des produits a preparer dans chaque resautant
		
		// Ajout de la commande dans le carnet du restaurant
		carnet.ajouteCommande(commande);

		return commande.hashCode();
	}
	
	// Definir le restaurant actif
	public void setRestaurantActif(Restaurant resto){
		this.resto = resto;
	}

	// Ajouter produit commande
	public void ajouterProduitCommande(Produit produit, int quantite) throws Exception {
		
		if (quantite <= 0)
			throw new Exception("Quantite (" + quantite + ") invalide");
		
		commande.addProduit(new LigneCommande(resto.getIdResto(), commande.getNumeroCommande(), 
						    				  produit.getDescription(), produit.getPrix(), quantite));
	}

	// Retourne une commande
	public Commande getCommande(int index) throws Exception {
		return carnet.getCommande(index);
	}

	// Retourne une commande
	public Commande getCommande(Commande commande) throws Exception {
		return carnet.getCommande(commande);
	}

	// Retourne un vecteur de toutes les commandes
	public Vector <Commande> getListeCommandeConfirmee() throws Exception{
		
		/**Vector <Commande> v = new Vector <Commande> ();
		
		for(int i = 0; i < liste.getListe().size(); i ++){
			v.addAll(liste.getRestaurant(i).getCarnet().getListCommandeConfirmerClient());
		}*/
		
		return carnet.getCarnet();
	}
	
	// Supprimer un produit de la commande (index)
	public void supprimerProduit(int index) throws Exception {
		commande.removeProduit(index);
	}

	// Supprimer un produit de la commande (produit)
	public void supprimerProduit(Produit produit) throws Exception {
		//commande.removeProduit(produit);
	}

	// Supprimer une commande du carnet (index)
	public void supprimerCommande(int index) throws Exception {
		//resto.supprimerCommande(index);
	}

	// Supprimer un produit de la commande (commande)
	public void supprimerCommande(Commande commande) throws Exception {
		//resto.supprimerCommande(commande);
	}

	// Retourne la liste des produit
	public Vector<Produit> getListe() {
		return resto.getMenu().getListe();
	}

	// Retourne la liste des produit
	public Vector<Restaurant> getCarnet() {
		return liste.getListe();
	}

	// Retourne le contenu de la commande
	public String toString() {
		return commande.toString();
	}
	
	// Ajoute un observateur a la commande
	public void ajouterObservateur(Observer observer) {
		commande.addObserver(observer);
	}
	
	// Determine le compte actif
	public void setCompteActif(AbstractCompte compte){
		this.compteActif = compte;
	}
	
	// Retourne le compte Actif
	public AbstractCompte getCompteActif(){
		return this.compteActif;
	}
}
